//
//  HMEmoticonTools.swift
//  WB25
//
//  Created by HM on 2017/7/10.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
// 最大列数
let HMEMOTICONMAXCOL = 7
// 最大行数
let HMEMOTICONMAXROW = 3
// 最大个数
let HMEMOTICONMAXCOUNT = (HMEMOTICONMAXCOL*HMEMOTICONMAXROW) - 1
class HMEmoticonTools: NSObject {
    
    // 全局访问点
    static let share: HMEmoticonTools = HMEmoticonTools()
    
    // 保存路径
    let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("recent.archiver")
    
    // 表情键盘bundle对象
    lazy var emoticonBundle: Bundle = {
        // 获取路径
        let path = Bundle.main.path(forResource: "Emoticons.bundle", ofType: nil)!
        let bundle = Bundle(path: path)!
        return bundle
    }()
    
    // 最近(最多只能保存20个)
    lazy var recentEmoticons:[HMEmoticonModel] = {
        return self.getRecentEmoticon()
    }()
    
    // 默认
    lazy var normalEmoticons:[HMEmoticonModel] = {
        return self.loadEmoticons(fileName: "default")
    }()
    
    // emoji
    lazy var emojiEmoticons:[HMEmoticonModel] = {
        return self.loadEmoticons(fileName: "emoji")
    }()
    
    // lxh
    lazy var lxhEmoticons:[HMEmoticonModel] = {
        return self.loadEmoticons(fileName: "lxh")
    }()
    
    // 三维数组
    lazy var allEmoticons:[[[HMEmoticonModel]]] = {
        return [
            [self.recentEmoticons],
            self.loadEmoticonGroups(emoticons: self.normalEmoticons),
            self.loadEmoticonGroups(emoticons: self.emojiEmoticons),
            self.loadEmoticonGroups(emoticons: self.lxhEmoticons)]
    }()

}

//MARK: - 通过图片描述 获取对应的图片模型
extension HMEmoticonTools{
    
    func getEmoticonModelWithChs(chs: String) -> HMEmoticonModel?{
        
        // 遍历默认表情
        for model in normalEmoticons{
            // 判断chs字符串是否相等
            if chs == model.chs {
                return model
            }
        }
        
        // 遍历浪小花表情
        for model in lxhEmoticons{
            if chs == model.chs {
                return model
            }
        }
        
        // 如果没有找到对应的chs
        return nil
    }
    
}
//MARK: - 通过路径获取不同的模型一维数组
extension HMEmoticonTools{
    fileprivate func loadEmoticons(fileName: String) -> [HMEmoticonModel]{
        // 路径
        let file = emoticonBundle.path(forResource: "\(fileName)/info.plist", ofType: nil)!
        // 字典数组
        let plistArray = NSArray(contentsOfFile: file)!
        // 使用YYModel
        let tempList = NSArray.yy_modelArray(with: HMEmoticonModel.self, json: plistArray) as! [HMEmoticonModel]
        // 遍历tempList
        // 计算得到每个图片的全路径
        for model in tempList {
            model.allPath = "\(fileName)/\(model.png ?? "")"
        }
        return tempList
    }
    // 通过一维数组获取二维数组
    /*
        默认: 108 [[20],[20],[20],[20],[20],[8]]
        emoji: 80 [[20],[20],[20],[20]]
        lxh : 40 [[20],[20]]
     
        lxh : 40 [[20-(0-19)],[20]-(20-39)]
     */
    func loadEmoticonGroups(emoticons:[HMEmoticonModel]) ->[[HMEmoticonModel]] {
        
        // 计算传入的一维数组应该显 示多少页
        let pageCount = (emoticons.count + (HMEMOTICONMAXCOUNT - 1))/HMEMOTICONMAXCOUNT
        
        // 创建一个临时可变的二位空数组
        var tempList:[[HMEmoticonModel]] = [[HMEmoticonModel]]()

        // 遍历count
        for i in 0..<pageCount{
            
            let location = HMEMOTICONMAXCOUNT * i
            var length = HMEMOTICONMAXCOUNT
            
            // 防止截取越界
            if location + length > emoticons.count {
                length = emoticons.count - location
            }
            
            // 计算范围
            let range = NSRange(location: location, length: length)
            
            let array = (emoticons as NSArray).subarray(with: range) as! [HMEmoticonModel]
            // 保存一维数组
            tempList.append(array)
        }
        return tempList
    }
}


extension HMEmoticonTools{
    // 保存最近表情模型
    func saveRecentEmoticon(emoticonModel: HMEmoticonModel){
        // 遍历
        for (i, model) in recentEmoticons.enumerated(){
            
            // 判断是否是emoji表情
            if emoticonModel.isEmoji {
                // 去重
                if emoticonModel.code ==  model.code {
                    recentEmoticons.remove(at: i)
                }
            }else{
                // 图片表情
                if emoticonModel.png == model.png {
                    recentEmoticons.remove(at: i)
                }
            }
        }
        // 添加模型到数组
        recentEmoticons.insert(emoticonModel, at: 0)
        // 超过20个删除
        if recentEmoticons.count > 20 {
            recentEmoticons.removeLast()
        }
        // 三维数组中的
        allEmoticons[0][0] = recentEmoticons
        // 保存到本地沙盒
        NSKeyedArchiver.archiveRootObject(recentEmoticons, toFile: file)
    }
    // 获取沙盒中保存的数据
    func getRecentEmoticon() ->[HMEmoticonModel] {
        guard let tempList = NSKeyedUnarchiver.unarchiveObject(withFile: file) as? [HMEmoticonModel] else{
            return [HMEmoticonModel]()
        }
        return tempList
    }
}

